package 力扣91;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @ClassName : Day1_989_数组形式的整数加法_lc题解
 * @Author : 骆发茂
 * @Date: 2021/12/14 23:31
 * @Description : https://leetcode-cn.com/problems/add-to-array-form-of-integer/
 * ### 思路
 *
 * 本来是想着是把两个数加起来，再依次取出个位，添加进结果中，但是这样会溢出。
 *
 * 于是选择从后往前遍历数组，末尾数字相加后添加进结果集中，同时判断一下有没有进位。
 *
 * 最后还要看看 k 和进位等于 0 没有，如果没有还要继续添加进结果集中。
 *
 * 最后需要Collections.reverse(res);反转链表
 *
 * <加法模板>
 *
 * while ( A 没完 || B 没完)
 *
 * A 的当前位
 *
 * B 的当前位
 *
 * 和 = A 的当前位 + B 的当前位 + 进位carry
 *
 * 当前位 = 和 % 10;
 *
 * 进位 = 和 / 10;
 *
 * 判断还有进位吗
 */
public class Day1_989_数组形式的整数加法_lc题解 {
    class Solution {
        public List<Integer> addToArrayForm(int[] num, int k) {
            List<Integer> res = new ArrayList<>();
            int carry = 0;//进位
            int l1 = num.length - 1;//最右边的索引开始
            while (l1 >= 0 || k != 0) {
                int x = l1 < 0 ? 0 : num[l1];//最左边，如果前面没有数了，就附上0
                int y = k == 0 ? 0 : k % 10;//取余->取出个位数   ////最左边，也就是前面没有数了，就附上0
                int sum = x + y + carry;
                carry = sum / 10;//取每次的进数
                res.add(sum % 10);//添加上每次的个位数
                l1--;
                k = k / 10;
            }
            //最左边的carr可能还有，判断是不是0
            if (carry != 0) {
                res.add(carry);
            }
            Collections.reverse(res);
            return res;
        }
    }
}